/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 *
 * http://www.gnu.org/copyleft/gpl.html
 */

package l1j.server.server.serverpackets;

import java.util.logging.Logger;

import l1j.server.server.Opcodes;
import l1j.server.server.model.Instance.L1ItemInstance;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.model.item.L1ItemId;
import l1j.server.server.templates.L1Armor;

// Referenced classes of package l1j.server.server.serverpackets:
// ServerBasePacket

public class S_InvList extends ServerBasePacket {

	private static Logger _log = Logger.getLogger(S_InvList.class.getName());
	private static final String S_INV_LIST = "[S] S_InvList";

	public S_InvList(L1PcInstance pc, L1ItemInstance item) {
		int itemType2 = item.getItem().getType2();
		int itemId = item.getItem().getItemId();
		int isId = item.isIdentified() ? 1 : 0;
		int weight = item.getCount() * item.getItem().getWeight() / 1000;
		if (item.getItem().getWeight() != 0 && weight < 1) {
			weight = 1;
		}
		writeC(Opcodes.S_OPCODE_INVLIST);
		writeC(1);
		writeD(item.getId());
		if (itemType2 == 0) { // 種別：その他のアイテム
			switch (itemId) {
			case L1ItemId.SCROLL_OF_ENCHANT_ARMOR: // 防具強化スクロール
			case L1ItemId.B_SCROLL_OF_ENCHANT_ARMOR: // 祝福された 防具強化スクロール
			case L1ItemId.C_SCROLL_OF_ENCHANT_ARMOR: // 呪われた 防具強化スクロール
			case 40078: // 古代人の呪術スクロール
			case 40129: // ギアンのスクロール
			case 140129: // 祝福された ギアンのスクロール
				writeC(27);
				break;

			case L1ItemId.SCROLL_OF_ENCHANT_WEAPON: // 武器強化スクロール
			case L1ItemId.B_SCROLL_OF_ENCHANT_WEAPON: // 祝福された 武器強化スクロール
			case L1ItemId.C_SCROLL_OF_ENCHANT_WEAPON: // 呪われた 武器強化スクロール
			case 40077: // 古代人の錬金術スクロール
			case 40130: // カルバスのスクロール
			case 140130: // 祝福された カルバスのスクロール
				writeC(26);
				break;

			case 40088: // 変身スクロール
			case 40096: // 象牙の塔の変身スクロール
			case 140088: // 祝福された 変身スクロール
				writeC(16);
				break;

			case 40317: // 砥石
			case 41036: // 糊
				writeC(14);
				break;

			case 40089: // 復活スクロール
			case 140089: // 祝福された 復活スクロール
				writeC(8);
				break;

			case 40098: // 象牙の塔の確認スクロール
			case 40126: // 確認スクロール
				writeC(7);
				break;

			case 40100: // テレポート スクロール
			case 40099: // 象牙の塔のテレポート スクロール
			case 40086: // マス テレポート スクロール
			case 40863: // スペル スクロール (テレポート)
				writeC(6);
				break;

			case 140100: // 祝福された テレポート スクロール
				writeC(29);
				break;

			case 40007: // コール ライトニング ワンド
			case 40008: // メイプル ワンド
			case 140008: // 祝福されたメイプル ワンド
			case 40410: // ブラック エントの表皮
				writeC(30);
				break;

			case 40090: // ブランク スクロール(Lv1)
			case 40091: // ブランク スクロール(Lv2)
			case 40092: // ブランク スクロール(Lv3)
			case 40093: // ブランク スクロール(Lv4)
			case 40094: // ブランク スクロール(Lv5)
				writeC(28);
				break;

			case 40859: // スペル スクロール (ヒール)
			case 40862: // スペル スクロール (エネルギー ボルト)
			case 40864: // スペル スクロール (アイス ダガー)
			case 40865: // スペル スクロール (ウインド カッター)
			case 40866: // スペル スクロール (ホーリー ウェポン)
			case 40867: // スペル スクロール (キュア ポイズン)
			case 40869: // スペル スクロール (カーズ ポイズン)
			case 40873: // スペル スクロール (ファイアー アロー)
			case 40874: // スペル スクロール (スタラック)
			case 40875: // スペル スクロール (ライトニング)
			case 40876: // スペル スクロール (ターン アンデッド)
			case 40877: // スペル スクロール (エキストラ ヒール)
			case 40878: // スペル スクロール (カーズ ブラインド)
			case 40880: // スペル スクロール (フローズン クラウド)
			case 40881: // スペル スクロール (ウィーク エレメンタル)
			case 40883: // スペル スクロール (ファイアー ボール)
			case 40884: // スペル スクロール (フィジカル エンチャント：DEX)
			case 40885: // スペル スクロール (ウェポン ブレイク)
			case 40887: // スペル スクロール (スロー)
			case 40888: // スペル スクロール (アース ジェイル)
			case 40891: // スペル スクロール (カーズ パラライズ)
			case 40892: // スペル スクロール (コール ライトニング)
			case 40893: // スペル スクロール (グレーター ヒール)
			case 40894: // スペル スクロール (テイミング モンスター)
			case 40895: // スペル スクロール (リムーブ カーズ)
			case 40896: // スペル スクロール (コーン オブ コールド)
			case 40898: // スペル スクロール (ダークネス)
				writeC(30);
				break;

			case 40868: // スペル スクロール (チル タッチ)
			case 40886: // スペル スクロール (バンパイアリック タッチ)
			case 40897: // スペル スクロール (マナ ドレイン)
				writeC(17);
				break;

			case 40870: // スペル スクロール (エンチャント ウェポン)
				writeC(26);
				break;

			case 40879: // スペル スクロール (ブレスド アーマー)
				writeC(27);
				break;

			case 40315: // ペットの笛
			case 40493: // マジック フルート
				writeC(15);
				break;

			case 40310: // 便箋
			case 40311: // 血盟便箋
				writeC(12);
				break;

			case 40730: // クリスマス カード(未使用)
				writeC(31);
				break;

			case 49020: // クリスマス カード(未開封)
			case 49021: // クリスマス カード(開封済み)
				writeC(32);
				break;

			case 40731: // バレンタインデー カード(未使用)
				writeC(33);
				break;

			case 49022: // バレンタインデー カード(未開封)
			case 49023: // バレンタインデー カード(開封済み)
				writeC(34);
				break;

			case 40732: // ホワイトデー カード(未使用)
				writeC(35);
				break;

			case 49024: // ホワイトデー カード(未開封)
			case 49025: // ホワイトデー カード(開封済み)
				writeC(36);
				break;

			default:
				writeC(0);
				break;
			}
		} else if (itemType2 == 1) { // 種別：武器
			writeC(1);
		} else if (itemType2 == 2) { // 種別：防具
			switch (item.getItem().getType()) {
			case 0: // none
				writeC(0);
				break;

			case 1: // helm
				writeC(22);
				break;

			case 2: // armor
				writeC(2);
				break;

			case 3: // T
				writeC(18);
				break;

			case 4: // cloak
				writeC(19);
				break;

			case 5: // glove
				writeC(20);
				break;

			case 6: // boots
				writeC(21);
				break;

			case 7: // shield
				writeC(25);
				break;

			case 8: // amulet
				writeC(24);
				break;

			case 9: // ring
				writeC(23);
				break;

			case 10: // belt
				writeC(37);
				break;

			case 12: // earring
				writeC(40);
				break;

			default:
				writeC(0);
				break;
			}
		}
		writeC(0);
		writeH(item.get_gfxid());
		writeC(item.getItem().getBless());
		writeD(item.getCount());
		writeC(isId);
		writeS(item.getViewName());
		if (itemType2 == 0) { // 種別：その他のアイテム
			if (isId == 0) {
				writeC(0);
			} else {
				switch (item.getItem().getType1()) {
				case 0:
					writeC(0x08);
					writeC(0x01);
					writeC(item.getItem().getDmgSmall());
					writeC(item.getItem().getDmgLarge());
					writeC(item.getItem().getMaterial());
					writeD(weight);
					break;
				case 15:
					writeC(0x08);
					writeC(0x01);
					writeC(item.getItem().getDmgSmall());
					writeC(item.getItem().getDmgLarge());
					writeC(item.getItem().getMaterial());
					writeD(weight);
					break;
				default:
					writeC(21);
					writeC(23);
					writeC(item.getItem().getMaterial());
					writeD(weight);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					writeC(0);
					break;
				}
			}
		} else if (itemType2 == 2) { // 種別：防具
			if (isId == 0) {
				writeC(0);
			} else {
				writeC(21);
				writeC(19);
				int ac = ((L1Armor) item.getItem()).get_ac();
				if (ac < 0) {
					ac = ac - ac - ac;
				}
				writeC(ac);
				writeC(item.getItem().getMaterial());
				int armor_weight = item.getItem().getWeight() / 1000;
				if (item.getItem().getWeight() != 0 && armor_weight < 1) {
					armor_weight = 1;
				}
				writeD(armor_weight);

				// EnchantLevelの表示
				writeC(2);
				writeC(item.getEnchantLevel());

				int total_byte = 0;

				boolean use_all_class = item.getItem().isUseDarkelf()
						&& item.getItem().isUseElf()
						&& item.getItem().isUseKnight()
						&& item.getItem().isUseRoyal()
						&& item.getItem().isUseMage();

				if (!use_all_class) {
					int bit = 0;
					bit |= item.getItem().isUseRoyal() ? 1 : 0;
					bit |= item.getItem().isUseKnight() ? 2 : 0;
					bit |= item.getItem().isUseElf() ? 4 : 0;
					bit |= item.getItem().isUseMage() ? 8 : 0;
					bit |= item.getItem().isUseDarkelf() ? 16 : 0;
					writeC(7);
					writeC(bit);
					total_byte += 2;
				}
				int addstr = item.getItem().get_addstr();
				int adddex = item.getItem().get_adddex();
				int addcon = item.getItem().get_addcon();
				int addwis = item.getItem().get_addwis();
				int addint = item.getItem().get_addint();
				int addcha = item.getItem().get_addcha();
				int addhp = item.getItem().get_addhp();
				int addmr = item.getMr();
				int addmp = item.getItem().get_addmp();
				int addsp = item.getItem().get_addsp();
				if (item.getItem().isHasteItem()) {
					if (total_byte < 12) {
						writeC(18);
						total_byte += 1;
					}
				}
				if (addstr != 0) {
					if (total_byte < 12) {
						writeC(8);
						writeC(addstr);
						total_byte += 2;
					}
				}
				if (adddex != 0) {
					if (total_byte < 12) {
						writeC(9);
						writeC(adddex);
						total_byte += 2;
					}
				}
				if (addcon != 0) {
					if (total_byte < 12) {
						writeC(10);
						writeC(addcon);
						total_byte += 2;
					}
				}
				if (addwis != 0) {
					if (total_byte < 12) {
						writeC(11);
						writeC(addwis);
						total_byte += 2;
					}
				}
				if (addint != 0) {
					if (total_byte < 12) {
						writeC(12);
						writeC(addint);
						total_byte += 2;
					}
				}
				if (addcha != 0) {
					if (total_byte < 12) {
						writeC(13);
						writeC(addcha);
						total_byte += 2;
					}
				}
				if (addhp != 0) {
					if (total_byte < 12) {
						writeC(14);
						writeH(addhp);
						total_byte += 3;
					}
				}
				if (addmp != 0) {
					if (total_byte < 12) {
						writeC(32);
						writeC(addmp);
						total_byte += 2;
					}
				}
				if (addmr != 0) {
					if (total_byte < 12) {
						writeC(15);
						writeC(addmr);
						total_byte += 2;
					}
				}
				if (addsp != 0) {
					if (total_byte < 12) {
						writeC(17);
						writeC(addsp);
						total_byte += 2;
					}
				}
				for (int j = 0; j < 12 - j; j++) {
					writeC(0);
				}
			}
		} else if (itemType2 == 1) { // 種別：武器
			if (isId == 0) {
				writeC(0);
			} else {
				writeC(21);
				writeC(1);
				writeC(item.getItem().getDmgSmall());
				writeC(item.getItem().getDmgLarge());
				writeC(item.getItem().getMaterial());
				int weapon_weight = item.getItem().getWeight() / 1000;
				if (item.getItem().getWeight() != 0 && weapon_weight < 1) {
					weapon_weight = 1;
				}
				writeD(weapon_weight);
				writeC(2);
				writeC(item.getEnchantLevel());

				int total_byte = 0;
				if (item.get_durability() != 0) {
					writeC(3);
					writeC(item.get_durability());
					total_byte += 2;
				}

				if (item.getItem().getType() == 3 // tohandsword
						|| item.getItem().getType() == 4 // bow
						|| item.getItem().getType() == 5 // spear
						|| item.getItem().getType() == 11 // claw
						|| item.getItem().getType() == 12) { // edoryu
					writeC(4);
					total_byte += 1;
				}
				if (item.getItem().getHitModifier() != 0) {
					writeC(5);
					writeC(item.getItem().getHitModifier());
					total_byte += 2;
				}
				if (item.getItem().getDmgModifier() != 0) {
					writeC(6);
					writeC(item.getItem().getDmgModifier());
					total_byte += 2;
				}
				boolean use_all_class = item.getItem().isUseDarkelf()
						&& item.getItem().isUseElf()
						&& item.getItem().isUseKnight()
						&& item.getItem().isUseRoyal()
						&& item.getItem().isUseMage();

				if (!use_all_class) {
					int bit = 0;
					bit |= item.getItem().isUseRoyal() ? 1 : 0;
					bit |= item.getItem().isUseKnight() ? 2 : 0;
					bit |= item.getItem().isUseElf() ? 4 : 0;
					bit |= item.getItem().isUseMage() ? 8 : 0;
					bit |= item.getItem().isUseDarkelf() ? 16 : 0;
					writeC(7);
					writeC(bit);
					total_byte += 2;
				}
				int addstr = item.getItem().get_addstr();
				int adddex = item.getItem().get_adddex();
				int addcon = item.getItem().get_addcon();
				int addwis = item.getItem().get_addwis();
				int addint = item.getItem().get_addint();
				int addcha = item.getItem().get_addcha();
				int addhp = item.getItem().get_addhp();
				int addmp = item.getItem().get_addmp();
				int addsp = item.getItem().get_addsp();
				if (itemId == 126 || itemId == 127) { // マナスタッフ、鋼鉄のマナスタッフ
					if (total_byte < 10) {
						writeC(16);
						total_byte += 1;
					}
				}
				if (item.getItem().isHasteItem()) {
					if (total_byte < 10) {
						writeC(18);
						total_byte += 1;
					}
				}
				if (addstr != 0) {
					if (total_byte < 10) {
						writeC(8);
						writeC(addstr);
						total_byte += 2;
					}
				}
				if (adddex != 0) {
					if (total_byte < 10) {
						writeC(9);
						writeC(adddex);
						total_byte += 2;
					}
				}
				if (addcon != 0) {
					if (total_byte < 10) {
						writeC(10);
						writeC(addcon);
						total_byte += 2;
					}
				}
				if (addwis != 0) {
					if (total_byte < 10) {
						writeC(11);
						writeC(addwis);
						total_byte += 2;
					}
				}
				if (addint != 0) {
					if (total_byte < 10) {
						writeC(12);
						writeC(addint);
						total_byte += 2;
					}
				}
				if (addcha != 0) {
					if (total_byte < 10) {
						writeC(13);
						writeC(addcha);
						total_byte += 2;
					}
				}
				if (addhp != 0) {
					if (total_byte < 10) {
						writeC(14);
						writeH(addhp);
						total_byte += 3;
					}
				}
				if (addmp != 0) {
					if (total_byte < 10) {
						writeC(32);
						writeC(addmp);
						total_byte += 2;
					}
				}
				if (addsp != 0) {
					if (total_byte < 10) {
						writeC(17);
						writeC(addsp);
						total_byte += 2;
					}
				}
				for (int k = 0; k < 11 - total_byte; k++) {
					writeC(0);
				}
			}
		}
	}

	@Override
	public byte[] getContent() {
		return getBytes();
	}

	public String getType() {
		return S_INV_LIST;
	}
}
